Trò chơi Tic-Tac-Toe, game đánh caro full source code
- PhotonAnimatorView.cs
- Views /
- PhotonNetwork /
- Plugins /
- Photon Unity Networking /
- Assets /
- project /
2 using System.Collections;
3 using System.Collections.Generic;
4
5 /// <summary>
6 /// This class helps you to synchronize Mecanim animations
7 /// Simply add the component to your GameObject and make sure that
8 /// the PhotonAnimatorView is added to the list of observed components
9 /// </summary>
10 [RequireComponent( typeof( Animator ) )]
11 [RequireComponent( typeof( PhotonView ) )]
12 [AddComponentMenu("Photon Networking/Photon Animator View")]
13 public class PhotonAnimatorView : MonoBehaviour
14 {
15 #region Enums
16 public enum ParameterType
17 {
18 Float = 1,
19 Int = 3,
20 Bool = 4,
21 Trigger = 9,
22 }
23
24 public enum SynchronizeType
25 {
26 Disabled = 0,
27 Discrete = 1,
28 Continuous = 2,
29 }
30
31 [System.Serializable]
32 public class SynchronizedParameter
33 {
34 public ParameterType Type;
35 public SynchronizeType SynchronizeType;
36 public string Name;
37 }
38
39 [System.Serializable]
40 public class SynchronizedLayer
41 {
42 public SynchronizeType SynchronizeType;
43 public int LayerIndex;
44 }
45 #endregion
46
47 #region Properties
48 #if PHOTON_DEVELOP
49 public PhotonAnimatorView ReceivingSender;
50 #endif
51 #endregion
52
53 #region Members
54 Animator m_Animator;
55
56 PhotonStreamQueue m_StreamQueue;
57
58 //These fields are only used in the CustomEditor for this script and would trigger a
59 //"this variable is never used" warning, which I am suppressing here
60 #pragma warning disable 0414
61 [HideInInspector]
62 [SerializeField]
63 bool ShowLayerWeightsInspector = true;
64
65 [HideInInspector]
66 [SerializeField]
67 bool ShowParameterInspector = true;
68 #pragma warning restore 0414
69
70 [HideInInspector]
71 [SerializeField]
72 List<SynchronizedParameter> m_SynchronizeParameters = new List<SynchronizedParameter>();
73
74 [HideInInspector]
75 [SerializeField]
76 List<SynchronizedLayer> m_SynchronizeLayers = new List<SynchronizedLayer>();
77
78 Vector3 m_ReceiverPosition;
79 float m_LastDeserializeTime;
80 bool m_WasSynchronizeTypeChanged = true;
81 PhotonView m_PhotonView;
82 #endregion
83
84 #region Unity
85 void Awake()
86 {
87 m_PhotonView = GetComponent<PhotonView>();
88 m_StreamQueue = new PhotonStreamQueue( 120 );
89
90 m_Animator = GetComponent<Animator>();
91 }
92
93 void Update()
94 {
95 if( m_PhotonView.isMine == false && PhotonNetwork.connected == true )
96 {
97 m_Animator.applyRootMotion = false;
98 }
99
100 if( m_PhotonView.isMine == true )
101 {
102 SerializeDataContinuously();
103 }
104 else
105 {
106 DeserializeDataContinuously();
107 }
108 }
109 #endregion
110
111 #region Setup Synchronizing Methods
112 /// <summary>
113 /// Check if a specific layer is configured to be synchronize
114 /// </summary>
115 /// <param name="layerIndex">Index of the layer.</param>
116 /// <returns>True if the layer is synchronized</returns>
117 public bool DoesLayerSynchronizeTypeExist( int layerIndex )
118 {
119 return m_SynchronizeLayers.FindIndex( item => item.LayerIndex == layerIndex ) != -1;
120 }
121
122 /// <summary>
123 /// Check if the specified parameter is configured to be synchronized
124 /// </summary>
125 /// <param name="name">The name of the parameter.</param>
126 /// <returns>True if the parameter is synchronized</returns>
127 public bool DoesParameterSynchronizeTypeExist( string name )
128 {
129 return m_SynchronizeParameters.FindIndex( item => item.Name == name ) != -1;
130 }
131
132 /// <summary>
133 /// Get a list of all synchronized layers
134 /// </summary>
135 /// <returns>List of SynchronizedLayer objects</returns>
136 public List<SynchronizedLayer> GetSynchronizedLayers()
137 {
138 return m_SynchronizeLayers;
139 }
140
141 /// <summary>
142 /// Get a list of all synchronized parameters
143 /// </summary>
144 /// <returns>List of SynchronizedParameter objects</returns>
145 public List<SynchronizedParameter> GetSynchronizedParameters()
146 {
147 return m_SynchronizeParameters;
148 }
149
150 /// <summary>
151 /// Gets the type how the layer is synchronized
152 /// </summary>
153 /// <param name="layerIndex">Index of the layer.</param>
154 /// <returns>Disabled/Discrete/Continuous</returns>
155 public SynchronizeType GetLayerSynchronizeType( int layerIndex )
156 {
157 int index = m_SynchronizeLayers.FindIndex( item => item.LayerIndex == layerIndex );
158
159 if( index == -1 )
160 {
161 return SynchronizeType.Disabled;
162 }
163
164 return m_SynchronizeLayers[ index ].SynchronizeType;
165 }
166
167 /// <summary>
168 /// Gets the type how the parameter is synchronized
169 /// </summary>
170 /// <param name="name">The name of the parameter.</param>
171 /// <returns>Disabled/Discrete/Continuous</returns>
172 public SynchronizeType GetParameterSynchronizeType( string name )
173 {
174 int index = m_SynchronizeParameters.FindIndex( item => item.Name == name );
175
176 if( index == -1 )
177 {
178 return SynchronizeType.Disabled;
179 }
180
181 return m_SynchronizeParameters[ index ].SynchronizeType;
182 }
183
184 /// <summary>
185 /// Sets the how a layer should be synchronized
186 /// </summary>
187 /// <param name="layerIndex">Index of the layer.</param>
188 /// <param name="synchronizeType">Disabled/Discrete/Continuous</param>
189 public void SetLayerSynchronized( int layerIndex, SynchronizeType synchronizeType )
190 {
191 if( Application.isPlaying == true )
192 {
193 m_WasSynchronizeTypeChanged = true;
194 }
195
196 int index = m_SynchronizeLayers.FindIndex( item => item.LayerIndex == layerIndex );
197
198 if( index == -1 )
199 {
200 m_SynchronizeLayers.Add( new SynchronizedLayer { LayerIndex = layerIndex, SynchronizeType = synchronizeType } );
201 }
202 else
203 {
204 m_SynchronizeLayers[ index ].SynchronizeType = synchronizeType;
205 }
206 }
207
208 /// <summary>
209 /// Sets the how a parameter should be synchronized
210 /// </summary>
211 /// <param name="name">The name of the parameter.</param>
212 /// <param name="synchronizeType">Disabled/Discrete/Continuous</param>
213 public void SetParameterSynchronized( string name, ParameterType type, SynchronizeType synchronizeType )
214 {
215 if( Application.isPlaying == true )
216 {
217 m_WasSynchronizeTypeChanged = true;
218 }
219
220 int index = m_SynchronizeParameters.FindIndex( item => item.Name == name );
221
222 if( index == -1 )
223 {
224 m_SynchronizeParameters.Add( new SynchronizedParameter { Name = name, Type = type, SynchronizeType = synchronizeType } );
225 }
226 else
227 {
228 m_SynchronizeParameters[ index ].SynchronizeType = synchronizeType;
229 }
230 }
231 #endregion
232
233 #region Serialization
234 void SerializeDataContinuously()
235 {
236 if( m_Animator == null )
237 {
238 return;
239 }
240
241 for( int i = 0; i < m_SynchronizeLayers.Count; ++i )
242 {
243 if( m_SynchronizeLayers[ i ].SynchronizeType == SynchronizeType.Continuous )
244 {
245 m_StreamQueue.SendNext( m_Animator.GetLayerWeight( m_SynchronizeLayers[ i ].LayerIndex ) );
246 }
247 }
248
249 for( int i = 0; i < m_SynchronizeParameters.Count; ++i )
250 {
251 SynchronizedParameter parameter = m_SynchronizeParameters[ i ];
252
253 if( parameter.SynchronizeType == SynchronizeType.Continuous )
254 {
255
256 switch( parameter.Type )
257 {
258 case ParameterType.Bool:
259 m_StreamQueue.SendNext( m_Animator.GetBool( parameter.Name ) );
260 break;
261 case ParameterType.Float:
262 m_StreamQueue.SendNext( m_Animator.GetFloat( parameter.Name ) );
263 break;
264 case ParameterType.Int:
265 m_StreamQueue.SendNext( m_Animator.GetInteger( parameter.Name ) );
266 break;
267 case ParameterType.Trigger:
268
269 break;
270 }
271 }
272 }
273 }
274
275 void DeserializeDataContinuously()
276 {
277 if( m_StreamQueue.HasQueuedObjects() == false )
278 {
279 return;
280 }
281
282 for( int i = 0; i < m_SynchronizeLayers.Count; ++i )
283 {
284 if( m_SynchronizeLayers[ i ].SynchronizeType == SynchronizeType.Continuous )
285 {
286 m_Animator.SetLayerWeight( m_SynchronizeLayers[ i ].LayerIndex, (float)m_StreamQueue.ReceiveNext() );
287 }
288 }
289
290 for( int i = 0; i < m_SynchronizeParameters.Count; ++i )
291 {
292 SynchronizedParameter parameter = m_SynchronizeParameters[ i ];
293
294 if( parameter.SynchronizeType == SynchronizeType.Continuous )
295 {
296 switch( parameter.Type )
297 {
298 case ParameterType.Bool:
299 m_Animator.SetBool( parameter.Name, (bool)m_StreamQueue.ReceiveNext() );
300 break;
301 case ParameterType.Float:
302 m_Animator.SetFloat( parameter.Name, (float)m_StreamQueue.ReceiveNext() );
303 break;
304 case ParameterType.Int:
305 m_Animator.SetInteger( parameter.Name, (int)m_StreamQueue.ReceiveNext() );
306 break;
307 case ParameterType.Trigger:
308
309 break;
310 }
311 }
312 }
313 }
314
315 void SerializeDataDiscretly( PhotonStream stream )
316 {
317 for( int i = 0; i < m_SynchronizeLayers.Count; ++i )
318 {
319 if( m_SynchronizeLayers[ i ].SynchronizeType == SynchronizeType.Discrete )
320 {
321 stream.SendNext( m_Animator.GetLayerWeight( m_SynchronizeLayers[ i ].LayerIndex ) );
322 }
323 }
324
325 for( int i = 0; i < m_SynchronizeParameters.Count; ++i )
326 {
327 SynchronizedParameter parameter = m_SynchronizeParameters[ i ];
328
329 if( parameter.SynchronizeType == SynchronizeType.Discrete )
330 {
331 switch( parameter.Type )
332 {
333 case ParameterType.Bool:
334 stream.SendNext( m_Animator.GetBool( parameter.Name ) );
335 break;
336 case ParameterType.Float:
337 stream.SendNext( m_Animator.GetFloat( parameter.Name ) );
338 break;
339 case ParameterType.Int:
340 stream.SendNext( m_Animator.GetInteger( parameter.Name ) );
341 break;
342 case ParameterType.Trigger:
343
344 break;
345 }
346 }
347 }
348 }
349
350 void DeserializeDataDiscretly( PhotonStream stream )
351 {
352 for( int i = 0; i < m_SynchronizeLayers.Count; ++i )
353 {
354 if( m_SynchronizeLayers[ i ].SynchronizeType == SynchronizeType.Discrete )
355 {
356 m_Animator.SetLayerWeight( m_SynchronizeLayers[ i ].LayerIndex, (float)stream.ReceiveNext() );
357 }
358 }
359
360 for( int i = 0; i < m_SynchronizeParameters.Count; ++i )
361 {
362 SynchronizedParameter parameter = m_SynchronizeParameters[ i ];
363
364 if( parameter.SynchronizeType == SynchronizeType.Discrete )
365 {
366 switch( parameter.Type )
367 {
368 case ParameterType.Bool:
369 if( stream.PeekNext() is bool == false )
370 {
371 return;
372 }
373
374 m_Animator.SetBool( parameter.Name, (bool)stream.ReceiveNext() );
375 break;
376 case ParameterType.Float:
377 if( stream.PeekNext() is float == false )
378 {
379 return;
380 }
381
382 m_Animator.SetFloat( parameter.Name, (float)stream.ReceiveNext() );
383 break;
384 case ParameterType.Int:
385 if( stream.PeekNext() is int == false )
386 {
387 return;
388 }
389
390 m_Animator.SetInteger( parameter.Name, (int)stream.ReceiveNext() );
391 break;
392 case ParameterType.Trigger:
393
394 break;
395 }
396 }
397 }
398 }
399
400 void SerializeSynchronizationTypeState( PhotonStream stream )
401 {
402 byte[] states = new byte[ m_SynchronizeLayers.Count + m_SynchronizeParameters.Count ];
403
404 for( int i = 0; i < m_SynchronizeLayers.Count; ++i )
405 {
406 states[ i ] = (byte)m_SynchronizeLayers[ i ].SynchronizeType;
407 }
408
409 for( int i = 0; i < m_SynchronizeParameters.Count; ++i )
410 {
411 states[ m_SynchronizeLayers.Count + i ] = (byte)m_SynchronizeParameters[ i ].SynchronizeType;
412 }
413
414 stream.SendNext( states );
415 }
416
417 void DeserializeSynchronizationTypeState( PhotonStream stream )
418 {
419 byte[] state = (byte[])stream.ReceiveNext();
420
421 for( int i = 0; i < m_SynchronizeLayers.Count; ++i )
422 {
423 m_SynchronizeLayers[ i ].SynchronizeType = (SynchronizeType)state[ i ];
424 }
425
426 for( int i = 0; i < m_SynchronizeParameters.Count; ++i )
427 {
428 m_SynchronizeParameters[ i ].SynchronizeType = (SynchronizeType)state[ m_SynchronizeLayers.Count + i ];
429 }
430 }
431
432 void OnPhotonSerializeView( PhotonStream stream, PhotonMessageInfo info )
433 {
434 if( m_Animator == null )
435 {
436 return;
437 }
438
439 if( stream.isWriting == true )
440 {
441 if( m_WasSynchronizeTypeChanged == true )
442 {
443 m_StreamQueue.Reset();
444 SerializeSynchronizationTypeState( stream );
445
446 m_WasSynchronizeTypeChanged = false;
447 }
448
449 m_StreamQueue.Serialize( stream );
450 SerializeDataDiscretly( stream );
451 }
452 else
453 {
454 #if PHOTON_DEVELOP
455 if( ReceivingSender != null )
456 {
457 ReceivingSender.OnPhotonSerializeView( stream, info );
458 }
459 else
460 #endif
461 {
462 if( stream.PeekNext() is byte[] )
463 {
464 DeserializeSynchronizationTypeState( stream );
465 }
466
467 m_StreamQueue.Deserialize( stream );
468 DeserializeDataDiscretly( stream );
469 }
470 }
471 }
472 #endregion
473 }
This class helps you to synchronize Mecanim animations
Simply add the component to your GameObject and make sure that
the PhotonAnimatorView is added to the list of observed components
These fields are only used in the CustomEditor for this script and would trigger a
"this variable is never used" warning, which I am suppressing here
Check if a specific layer is configured to be synchronize
Index of the layer.
Check if the specified parameter is configured to be synchronized
The name of the parameter.
Get a list of all synchronized layers
Get a list of all synchronized parameters
Gets the type how the layer is synchronized
Index of the layer.
Gets the type how the parameter is synchronized
The name of the parameter.
Sets the how a layer should be synchronized
Index of the layer.
DisabledDiscreteContinuous
Sets the how a parameter should be synchronized
The name of the parameter.
DisabledDiscreteContinuous